package com.demo.component;

import com.demo.model.Book;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * BookBeans, BookController, BookAdviceController, Book, BookApp这五个类
 * 是为了说明 Bean 对象被修改的例子.
 * 以上问题的原因是因为 Bean 默认情况下是单例状态（singleton）
 * 在 Spring 中 Bean 的作⽤域默认也是 singleton 单例模式。
 * Bean 的 6 种作⽤域:
 * 1. singleton：单例作⽤域
 * 2. prototype：原型作⽤域（多例作⽤域）
 * 3. request：请求作⽤域
 * 4. session：回话作⽤域
 * 5. application：全局作⽤域
 * 6. websocket：HTTP WebSocket 作⽤域
 * 注意后 4 种状态是 Spring MVC 中的值，在普通的 Spring 项⽬中只有前两种
 */
@Component
public class BookBeans {
    // 未设置作用域之前的结果:
    // book: Book(id=12, name=Java)
    // b: Book(id=12, name=C++)
    // book: Book(id=12, name=C++)
    // 设置作用域之后:
    // book: Book(id=12, name=Java)
    // b: Book(id=12, name=C++)
    // book: Book(id=12, name=Java)
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)// 设置 Bean 作用域
    // 也可以在这么设置: @Scope("prototype")
    @Bean
    public Book book() {
        Book book = new Book();
        book.setId(12);
        book.setName("Java");

        return book;
    }
}
